iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 27

番外: Derived Path

  • 分享至 

  • xImage
  •  

在開發過程當中,曾經一度想要取得 IndexStore

取得的管道

  • 一個是可以透過 xcodebuild 的某個指令取得
  • 另一個就是自己算

Derived Path

Input

/path/to/MyTest.xcodeproj

由三個元素組合而成

  • ENV DerivedData: ~/Library/Developer/Xcode/DerivedData
  • Project Name: MyTest
  • HASH: ABCD(假設)
    • hash("/path/to/MyTest.xcodeproj")

因此最終的路徑為

"~/Library/Developer/Xcode/DerivedData/MyTest-(hash("/path/to/MyTest.xcodeproj"))"

也就是

"~/Library/Developer/Xcode/DerivedData/MyTest-ABCD"


Code

import Foundation
import CryptoSwift

public struct DerivedPath {
    public static let `default`: String = "\(NSHomeDirectory())/Library/Developer/Xcode/DerivedData"
    private let name: String
    
    public init?(_ path: String) {
        let url = URL(fileURLWithPath: path)
        let fileName: String = url.deletingPathExtension().lastPathComponent
        let absolutePath = url.path
        let data = Data(absolutePath.utf8)
        
        let digestBytes: [UInt8] = [UInt8](data.md5())
   
        let digest64: [UInt64] = unsafeBitCast(digestBytes, to: [UInt64].self)
        var resultStr: [UInt8] = Array<UInt8>(repeating: 0, count: 28)
        var startValue: UInt64 = 0
        
        startValue = CFSwapInt64BigToHost(digest64[0])
        for index in (0...13).reversed() {
            resultStr[index] = UInt8(startValue % 26) + 97 // 'a'
            startValue /= 26
        }
        
        startValue = CFSwapInt64BigToHost(digest64[1])
        for index in (14...27).reversed() {
            resultStr[index] = UInt8(startValue % 26) + 97 // 'a'
            startValue /= 26
        }
        guard let derived: String = String(bytes: resultStr, encoding: .utf8) else { return nil }
        self.name = "\(fileName)-\(derived)"
    }
}

上一篇
番外: IndexStore DB
下一篇
概念驗證 Test Leak
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言